package com.weeego.web.base;

import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.HibernateTransactionManager;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;

/**
 * 
 * @author g
 * 
 */
public class BaseDAOImpl extends HibernateDaoSupport implements BaseDAO {

	public List findByHql(int pageNo, int pageSize, String queryname) {

		// 通过配置文件中读取hql语句
		// Query query = getSession().getNamedQuery(queryname);
		// query.setFirstResult((pageNo - 1) * pageSize);
		// query.setMaxResults(pageSize);
		// List list = query.list();
		// return list;

		Query query = getSession().createQuery(queryname);
		query.setFirstResult((pageNo - 1) * pageSize);
		query.setMaxResults(pageSize);
		List list = query.list();
		return list;

	}

	public List findAll(Serializable serializable) {
		String hql = "  from " + serializable.getClass().getName() + " t";
		return findByHql(hql);
	}

	public List findByHql(String hql) {
		return getHibernateTemplate().find(hql);
	}

	public Serializable findObjectByHql(String hql) {

		List list = findByHql(hql);
		if (list.size() == 0) {
			return null;
		}
		return (Serializable) list.get(0);
	}

	public Serializable findObjectById(Serializable serializable, String id) {
		String hql = "select t from " + serializable.getClass().getName()
				+ " t where t.id=" + id;

		return findObjectByHql(hql);
	}

	public Serializable findObjectById(Serializable serializable, int id) {
		return findObjectById(serializable, id + "");
	}

	public Serializable findObject(Serializable serializabl) {
		return (Serializable) getHibernateTemplate().findByExample(serializabl);
	}

	public Serializable save(Serializable serializable) {
		getHibernateTemplate().save(serializable);
		return serializable;
	}

	public Serializable saveOrUpdate(Serializable serializable) {
		getHibernateTemplate().saveOrUpdate(serializable);
		return serializable;
	}

	public Serializable update(Serializable serializable) {
		getHibernateTemplate().update(serializable);
		return serializable;
	}

	public List ListQueryByHql(int pageNo, int pageSize, String queryname) {
		Query query = getSession().createQuery(queryname);
		query.setFirstResult((pageNo - 1) * pageSize);
		query.setMaxResults(pageSize);
		List list = query.list();
		return list;

	}

	public void commonDelete(String hql) {
		// TODO Auto-generated method stub

	}

	public Long count(Serializable serializable) {
		try {
			String hql = "select count(t) from "
					+ serializable.getClass().getName() + " t";
			return countByHql(hql);
		} catch (Exception e) {
			return new Long(0);
		}
	}

	public Long countByHql(String hql) {

		Session session = getSession();
		Long count = (Long) session.createQuery(hql).uniqueResult();
		return count;

	}

	public void runHql(String hql) {
		Session session = getSession();
		session.createQuery(hql).executeUpdate();
	}

	public void updateByHQL(String hql) {
		runHql(hql);
	}

	public void delete(Serializable serializable) {
		getHibernateTemplate().delete(serializable);
	}

	public void deleteByHql(String hql) {
		runHql(hql);

	}

	public void deleteById(Serializable serializable, String id) {
		String hql = "delete from " + serializable.getClass().getName()
				+ " where id in  (" + id + " )";
		runHql(hql);

	}

	public void deleteById(Serializable serializable, int id) {
		String hql = "delete from " + serializable.getClass().getName()
				+ " where id=" + id;
		runHql(hql);
	}

}
